package com.itheima.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.itheima.dao.MemberDao;
import com.itheima.pojo.Member;
import com.itheima.service.MemberService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

@Service
@Slf4j
public class MemberServiceImpl implements MemberService {

    @Autowired
    MemberDao memberDao;

    @Override
    public Member findByTelephone(String telephone) {
        Member member = memberDao.findByTelephone(telephone);
        return member;
    }

    @Override
    public void add(Member member) {
        memberDao.add(member);
    }



    /**
     * 1.需要计算出当前时间之前的12个月 需要获得的是 yyyy-MM的形式返回给前端
     * 2.需要计算出每个月份的最后一天 然后去数据库查询 小于这天的所有会员数量 记录下来
     * <p>
     * 前端需要格式是  months月份  memberCount会员数量  一一对应
     *
     * @return
     */
    @Override
    public Map<String, Object> getYearAndMemberCount() throws ParseException {
        //先创建一个map 等会需要存Long类型的集合（会员数量） 和spring类型的集合（日期）
        Map<String, Object> map = new HashMap<>();
        //存放会员数量用
        List<Long> memberConuts = new ArrayList<>();
        //   调用方法获得当前日期之前的12个月
        List<String> months = getMonths();

        //获得每一个月
        for (String month : months) {
            //拼接为每月的第一天 用来当参数调用方法
            String date = month + "-01";
            //调用方法 通过获得传入日期（月份）的最后一天
            Date lastDay = getLastDay(date);
            //根据最后一天去数据库查询 创建日期小于他的会员 获得数量
            Long count = memberDao.findMemberCountByDate(lastDay);
            //添加到存放会员数量的集合中
            memberConuts.add(count);
        }

        // 给map加属性 key为前端要的 key值 名字不能变  value为查处理的月份
        map.put("months", months);
        map.put("memberCount", memberConuts);   //value每个月之前的会员数量
        return map;
    }




    //获取当前时间的前12个月的时间 yyyy-MM格式
    public List<String> getMonths() {
        ArrayList<String> months = new ArrayList<>();
        //获得当前日历对象
        Calendar calendar = Calendar.getInstance();
        //把日历月份调整为 13个月前
        calendar.add(calendar.MONTH, -13);
        for (int i = 0; i < 12; i++) {
            // 一个月一个月的加 从13个月前 加到当前日期的上一个月
            calendar.add(calendar.MONTH, 1);
            //通过日历对象获得日期对象
            Date date = calendar.getTime();

            //转换一下返回
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
            String format = sdf.format(date);
            months.add(format);
        }
        return months;
    }




    //根据一个月的第一天 获得最后一天   传进来的参数格式为 2020-09-01 天数都是01 每个月第一天
    public Date getLastDay(String month) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date date = sdf.parse(month);
        //把传进来的参数设置到 calendar日历对象中
        //先把月份 +1  再把天数 -1  就得到了传来参数的最后一天 然后转成日期对象返回
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(calendar.MONTH, 1);
        calendar.add(calendar.DAY_OF_MONTH, -1);
        Date time = calendar.getTime();
        return time;
    }


}
